home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 26
/
Cream of the Crop 26.iso
/
doom
/
quake.zip
/
TORNADO.ZIP
/
STORMBMB.QC
< prev
next >
Wrap
Text File
|
1997-04-30
|
8KB
|
274 lines
//////////////////////////////////////////////////////////
// STORM_BOMB - Version 1.1 //
// 3/12/97 - John Mason //
// jwmason1@ix.netcom.com //
// //
// 1.0 - 12/12/96 - Initial release //
// //
// 1.1 - 04/30/97 - Fixed the following problems: //
// Chaser bombs going through walls //
//////////////////////////////////////////////////////////
float fBombLife;
float fPlayedWav;
float fNumBombs;
void() W_LaunchStormBomb;
void() StormBombTouch;
void() StormBombRiser;
void() StormBombSplit;
void(entity targ, vector org) StormBombChaser;
void() StormBombChaserTouch;
void() StormBombChaserLightning;
void() StormBombChaserExplode;
void() W_LaunchStormBomb =
{
local entity sb_grenade;
fBombLife = 5;
fPlayedWav = 0;
fNumBombs = 0;
// If player has less than 5 rockets, don't fire Storm Bomb
if ((self.ammo_rockets < 5) || !(self.weapon & (IT_GRENADE_LAUNCHER | IT_STORM_BOMB)))
{
sprint(self,"Not enough ammo to launch Storm Bomb\n");
return;
}
// Subtract 5 rockets from players ammo
self.currentammo = self.ammo_rockets = self.ammo_rockets - 5;
sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
// Set the recoil angle
self.punchangle_x = -2;
// Spawn the grenade - standard id style
sb_grenade = spawn ();
sb_grenade.owner = self;
sb_grenade.movetype = MOVETYPE_BOUNCE;
sb_grenade.solid = SOLID_BBOX;
sb_grenade.classname = "sb_grenade";
// Set the missile speed
makevectors (self.v_angle);
if (self.v_angle_x)
sb_grenade.velocity = v_forward * 600 + v_up * 200 + crandom() * v_right * 10 + crandom() * v_up * 10;
else
{
sb_grenade.velocity = aim(self, 10000);
sb_grenade.velocity = sb_grenade.velocity * 600;
sb_grenade.velocity_z = 200;
}
sb_grenade.avelocity = '300 300 300';
sb_grenade.angles = vectoangles(sb_grenade.velocity);
sb_grenade.touch = StormBombTouch;
// Set Duration
sb_grenade.nextthink = time + 1;
sb_grenade.think = StormBombRiser;
setmodel (sb_grenade, "progs/grenade.mdl");
setsize (sb_grenade, '0 0 0', '0 0 0');
setorigin (sb_grenade, self.origin);
};
void() StormBombTouch =
{
// Did the grenade hit a someone?
if (other.takedamage)
{
sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);
return;
}
else
{
sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);
if (self.velocity == '0 0 0')
self.avelocity = '0 0 0';
}
};
void() StormBombRiser=
{
local entity sb_riser;
// Make the SBGrenade stop
self.movetype=MOVETYPE_NONE;
self.velocity='0 0 0';
// Draw a tiny explosion (no particles)
setmodel(self, "progs/s_explod.spr");
s_explode1();
sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
// Spawn and animate the 'second stage'
sb_riser = spawn();
sb_riser.owner = self.owner;
sb_riser.movetype = MOVETYPE_FLYMISSILE;
sb_riser.solid = SOLID_BBOX;
sb_riser.classname = "sb_riser";
// Set speed
sb_riser.velocity = '0 0 100';
sb_riser.angles = vectoangles(sb_riser.velocity);
sb_riser.touch = StormBombTouch;
// Set Duration
sb_riser.nextthink = time + 1;
sb_riser.think = StormBombSplit;
setmodel (sb_riser, "progs/missile.mdl");
setsize (sb_riser, '0 0 0', '0 0 0');
setorigin (sb_riser, self.origin);
};
void() StormBombSplit =
{
local entity head;
// Make the SBRiser stop
self.movetype=MOVETYPE_NONE;
self.velocity='0 0 0';
// Draw a tiny explosion (no particles)
setmodel(self, "progs/s_explod.spr");
s_explode1();
sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
head = findradius(self.origin, 1500);
while (head)
{
if (visible(head))
if ((head.flags & FL_MONSTER) || (head.classname == "player"))
if (head != self.owner)
StormBombChaser(head, self.origin);
head = head.chain;
}
};
void(entity targ, vector org) StormBombChaser =
{
local entity sb_chaser;
local vector vdestdelta;
local float len, traveltime;
fNumBombs = fNumBombs + 1;
// Spawn and animate the 'second stage'
sb_chaser = spawn();
sb_chaser.owner = self.owner;
sb_chaser.movetype = MOVETYPE_FLYMISSILE;
sb_chaser.solid = SOLID_BBOX;
sb_chaser.classname = "sb_chaser";
sb_chaser.enemy = targ;
// Set speed
vdestdelta = targ.origin - org;
len = vlen(vdestdelta);
traveltime = len / 150;
sb_chaser.velocity = vdestdelta * (1/traveltime);
sb_chaser.velocity_z = 0;
// missile.velocity = '0 0 0';
sb_chaser.angles = vectoangles(sb_chaser.velocity);
sb_chaser.touch = StormBombChaserTouch;
// Set Duration
sb_chaser.nextthink = time + 0.1;
sb_chaser.think = StormBombChaserLightning;
setmodel (sb_chaser, "progs/missile.mdl");
setsize (sb_chaser, '0 0 0', '0 0 0');
setorigin (sb_chaser, self.origin);
};
void() StormBombChaserTouch =
{
sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);
if (other == world)
{
self.velocity == '0 0 0';
self.avelocity = '0 0 0';
self.movetype = MOVETYPE_NONE;
self.touch = SUB_Null;
}
};
void() StormBombChaserLightning =
{
local vector vdestdelta;
local float len, traveltime;
if (fNumBombs != 0)
fBombLife = fBombLife - (0.05 / fNumBombs);
else
fBombLife = 0;
if (fBombLife >= 1)
{
// Old try - setting origin - not too good, huh ?! (Monsters get stuck in walls and shit)
// trace_ent.origin = trace_ent.origin + (0.1 * (self.origin - trace_ent.origin));
vdestdelta = self.origin - self.enemy.origin;
len = vlen(vdestdelta);
traveltime = len / 200;
self.enemy.flags = self.enemy.flags - (self.enemy.flags & FL_ONGROUND);
self.enemy.velocity = vdestdelta * (1/traveltime);
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_LIGHTNING2);
WriteEntity (MSG_BROADCAST, self);
WriteCoord (MSG_BROADCAST, self.origin_x);
WriteCoord (MSG_BROADCAST, self.origin_y);
WriteCoord (MSG_BROADCAST, self.origin_z);
WriteCoord (MSG_BROADCAST, self.enemy.origin_x);
WriteCoord (MSG_BROADCAST, self.enemy.origin_y);
WriteCoord (MSG_BROADCAST, self.enemy.origin_z);
// No damage done by lightning, just used to disable target
LightningDamage(self.origin, self.enemy.origin, self, 0);
self.nextthink = time + 0.05;
self.think = StormBombChaserLightning;
self.touch = StormBombChaserTouch;
if ((fBombLife < 2) && (fPlayedWav == 0))
{
sound (self.owner, CHAN_AUTO, "shitin.wav", 1, ATTN_NORM);
fPlayedWav = 1;
}
}
else
StormBombChaserExplode();
};
void() StormBombChaserExplode =
{
T_RadiusDamage (self, self.owner, 150, world);
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_EXPLOSION);
WriteCoord (MSG_BROADCAST, self.origin_x);
WriteCoord (MSG_BROADCAST, self.origin_y);
WriteCoord (MSG_BROADCAST, self.origin_z);
BecomeExplosion ();
};
//////////////////////////////////////////////////////////
// //
// End of STORM_BOMB code //
// //
//////////////////////////////////////////////////////////